//////////////////////////////////////////////////////////////////////////

#ifndef _CONTROL_H_
#include "control.h"
#endif

//////////////////////////////////////////////////////////////////////////

#ifndef _INPUT_H_
#include "input.h"
#endif

#ifndef _THEME_H_
#include "theme.h"
#endif

#ifndef _IMAGESURFACE_H_
#include "imagesurface.h"
#endif

#ifndef _TEXTSURFACE_H_
#include "textsurface.h"
#endif

#include <SDL_mixer.h>

//////////////////////////////////////////////////////////////////////////


GUI_Control::~GUI_Control()
{

}


//////////////////////////////////////////////////////////////////////////


float GUI_Control::Top()
{
    return m_YPosition;
}


//////////////////////////////////////////////////////////////////////////


float GUI_Control::Left()
{
    return m_XPosition;
}


////////////////////////////////////////////////////////////////////////////////


bool GUI_Control::Render(SDL_Surface *_mainSurface)
{
    if ((m_HasHover) || (m_HasFocus))
        m_Hover->Blt(_mainSurface, m_XPosition, m_YPosition);
    else
        m_Background->Blt(_mainSurface, m_XPosition, m_YPosition);
    if (m_Text->GetText().size() > 0)
        m_Text->Blt(_mainSurface, m_XPosition, m_YPosition, m_TextAllign, m_HorisontalMargin, m_VerticalMargin);
    return true;
}


//////////////////////////////////////////////////////////////////////////


void GUI_Control::Resize()
{
    m_Background->Resize();
    m_Text->Resize();
    m_Hover->Resize();
}


//////////////////////////////////////////////////////////////////////////


const std::string& GUI_Control::GetText()
{
    return m_Text->GetText();
}


//////////////////////////////////////////////////////////////////////////


void GUI_Control::SetText(const std::string& _text)
{
    m_Text->SetText(_text);
}


////////////////////////////////////////////////////////////////////////////////


GUI_Control::InputResult GUI_Control::OnMousePositionChanged(Input* _input)
{
    bool changed = false;
    Input::MousePosition pos = _input->GetMousePosition();
    SDL_Rect rc;
    rc.x = (m_XPosition - m_Background->Width() / 2) * GUI_Theme::GetResizeFactor();
    rc.w = (m_XPosition + m_Background->Width() / 2) * GUI_Theme::GetResizeFactor();
    rc.y = (m_YPosition / 1.6 - m_Background->Height() / 2) * GUI_Theme::GetResizeFactor();
    rc.h = (m_YPosition / 1.6 + m_Background->Height() / 2) * GUI_Theme::GetResizeFactor();

    if ((pos.x > rc.x) &&
        (pos.x < rc.w) &&
        (pos.y > rc.y) &&
        (pos.y < rc.h))
    {
        changed = !m_HasHover;
        m_HasHover = true;
    }
    else
    {
        changed = m_HasHover;
        m_HasHover = false;
    }
    if (changed) Mix_PlayChannel(-1, GUI_Theme::GetSound(GUI_Sounds::Hover), 0);
    return (changed) ? IR_NeedRepaint : IR_NoChanges;
}


//////////////////////////////////////////////////////////////////////////


void GUI_Control::DropFocus()
{
    m_HasFocus = false;
    m_HasHover = false;
}


//////////////////////////////////////////////////////////////////////////
